home *** CD-ROM | disk | FTP | other *** search
/ HyperLib 1997 Winter - Disc 1 / HYPERLIB-1997-Winter-CD1.ISO.7z / HYPERLIB-1997-Winter-CD1.ISO / オンラインウェア / PRG / MacPerl 506 appl folder.sit / MacPerl 506 appl folder / Mac_Perl_506r1m_appl / lib / assert.pl < prev    next >
Text File  |  1995-03-19  |  1KB  |  54 lines

  1. # assert.pl
  2. # tchrist@convex.com (Tom Christiansen)
  3. # Usage:
  4. #     &assert('@x > @y');
  5. #     &assert('$var > 10', $var, $othervar, @various_info);
  6. # That is, if the first expression evals false, we blow up.  The
  7. # rest of the args, if any, are nice to know because they will
  8. # be printed out by &panic, which is just the stack-backtrace
  9. # routine shamelessly borrowed from the perl debugger.
  10.  
  11. sub assert {
  12.     &panic("ASSERTION BOTCHED: $_[$[]",$@) unless eval $_[$[];
  13.  
  14. sub panic {
  15.     select(STDERR);
  16.  
  17.     print "¥npanic: @_¥n";
  18.  
  19.     exit 1 if $] <= 4.003;  # caller broken
  20.  
  21.     # stack traceback gratefully borrowed from perl debugger
  22.  
  23.     local($i,$_);
  24.     local($p,$f,$l,$s,$h,$a,@a,@sub);
  25.     for ($i = 0; ($p,$f,$l,$s,$h,$w) = caller($i); $i++) {
  26.     @a = @DB'args;
  27.     for (@a) {
  28.         if (/^StB¥000/ && length($_) == length($_main{'_main'})) {
  29.         $_ = sprintf("%s",$_);
  30.         }
  31.         else {
  32.         s/'/¥¥'/g;
  33.         s/([^¥0]*)/'$1'/ unless /^-?[¥d.]+$/;
  34. #        s/([¥200-¥377])/sprintf("M-%c",ord($1)&0177)/eg;
  35.         s/([¥0-¥37¥177])/sprintf("^%c",ord($1)^64)/eg;
  36.         }
  37.     }
  38.     $w = $w ? '@ = ' : '$ = ';
  39.     $a = $h ? '(' . join(', ', @a) . ')' : '';
  40. #     push(@sub, "$w&$s$a from file $f line $l¥n");
  41.     push(@sub, "file $f; line $l # $w&$s$a¥n");
  42.     }
  43.     for ($i=0; $i <= $#sub; $i++) {
  44.     print $sub[$i];
  45.     }
  46.     exit 1;
  47.  
  48. 1;
  49.